package com.cool.shark.service.Impl;

import com.cool.shark.ex.ServiceException;
import com.cool.shark.mapper.CartMapper;
import com.cool.shark.pojo.dto.CartInsertDto;
import com.cool.shark.pojo.entity.Cart;
import com.cool.shark.pojo.vo.cartNumVo;
import com.cool.shark.service.CartService;
import com.cool.shark.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

/**
 * @Name: CartServiceImpl
 * @Author: 西风残叶
 * @Date: 2024/4/28 13:56
 * @Version: 1.0
 * @TODO: TODO
 */
@Service
@Slf4j
public class CartServiceImpl implements CartService {
    @Autowired
    private CartMapper mapper;

    /**
     * 插入购物车信息到数据库
     *
     * @param cartInsertDto 购物车对象，包含购物车中的商品等信息
     */
    @Override
    public void insert(CartInsertDto cartInsertDto) {
        log.info("开始处理添加购物车业务,参数:{}", cartInsertDto);
        int rows = mapper.selectByUserIdAndTitle(cartInsertDto);
        if (rows == 1) {
            mapper.updateByAddCart(cartInsertDto.getUserId(), cartInsertDto.getNum());
            log.info("购物车中已存在该商品，数量+{}", cartInsertDto.getNum());
        }
        Cart cart = new Cart();
        BeanUtils.copyProperties(cartInsertDto, cart);
        log.info("cart = {}",cart);
        int insert = mapper.insert(cart);
        if (insert == 0) {
            String msg = "添加购物车失败,服务忙,请稍后再试";
            throw new ServiceException(ServiceCode.ERR_INSERT_FAILED, msg);
        }
        log.info("添加购物车成功");
    }

    @Override
    public List<Cart> list(Integer userId) {
        if (userId == null) {
            String msg = "查询购物车列表失败,用户id不能为空";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST, msg);
        }
        log.info("开始查询购物查列表");
        List<Cart> list = mapper.list(userId);
        return list;
    }

    /**
     * 根据用户ID查询购物车商品数量统计。
     *
     * @param userId 用户的唯一标识符。
     * @return 返回一个包含购物车商品数量统计信息的列表。
     */
    @Override
    public List<cartNumVo> cartNumVo(Long userId) {
        log.info("开始查询购物车商品数量统计,参数:{}",userId);
        List<cartNumVo> cartNumVos = mapper.cartNumVo(userId);
        return cartNumVos;
    }

    /**
     * 根据购物车商品ID和用户id删除购物车商品。
     *
     * @param spuId  商品Id。
     * @param userId 用户Id。
     * @return 返回删除操作影响的行数，通常为1表示删除成功，为0表示删除失败或未执行。
     */
    @Override
    public void delete(Long spuId, Integer userId) {
        log.info("开始删除购物车商品,参数:{},{}",spuId,userId);
        int rows = mapper.delete(spuId, userId);
        if (rows == 0){
            String msg = "删除购物车商品失败,服务忙,请稍后再试";
            throw new ServiceException(ServiceCode.ERR_DELETE_FAILED, msg);
        }
        log.info("删除购物车商品成功");
    }
}
